#!/usr/bin/python3
# -*- coding:utf-8 -*-
""""
@Author: lijk34925
@Time: 2023/4/21 9:12
@File: DiffJson.py
"""
import json

from deepdiff import DeepDiff

from BladeFerm.Lib.Common import logger



class DiffJson:
    """
    对比2份json数据的差异
    """
    def __init__(self):
        self.check_result = None
        self.kwargs = {}           # 设置对比的参数，参考网址：https://zepworks.com/deepdiff/5.8.2/diff.html

    def set_compare_kwargs(self, params: dict = None):
        """
        设置对比参数
        @param params: 场景的参数列表：
            - exclude_regex_paths: [exclude_path，。。。]   # 要排除的路径 正则路径，eg：r"root\[\d+\]\['b'\]"
            - ignore_order： True                          # 忽略列表的顺序进行对比
            - ignore_string_type_changes: True    # 对比忽略字符串
            - ignore_numeric_type_changes: True   # 对比忽略数字的类型
            - ignore_encoding_errors: True        # 对比忽略编码
        @return:
        """
        if params:
            self.kwargs.update(params)
        # logger.info(f'设置对比的参数为： {DealSql}')

    def compare_json(self, raw_data, target_data):
        """
        对比2份json文件，返回差异结果
        @param raw_data:
        @param target_data:
        @return:
        """
        self.check_result = DeepDiff(raw_data, target_data, **self.kwargs)
        return self.__get_result()

    def __get_result(self):
        """
        获取结果。判断成功还是失败
        @return:
        """
        resposne = {'success': 0, 'message': '尚未比对'}
        # result = self.check_result.to_dict()
        diff_result = self.check_result.to_json()
        result = json.loads(diff_result)
        if result:
            resposne.update({'success': 1, 'message': '检查结果：'})
            values_changed = result.get('values_changed')
            if values_changed:
                resposne.update({'success': 0, 'message': resposne.get('message')+'存在值变化的字段；'})
                logger.error(f'values_changed: {values_changed}')
                resposne['values_changed'] = values_changed
            type_changes = result.get('type_changes')
            if type_changes and not self.kwargs.get('ignore_numeric_type_changes'):
                resposne.update({'success': 0, 'message': resposne.get('message')+'存在值类型改变的字段；'})
                logger.error(f'type_changes: {type_changes}')
                resposne['type_changes'] = type_changes
            if resposne.get('success') == 1:
                resposne.update({'message': '检查结果：通过。字段的值和类型都是一致的！'})
        else:
            resposne.update({'success': 1, 'message': '检查没有差异'})
        resposne['diff_result'] = diff_result
        logger.debug(f'resposne : {resposne}')
        return resposne

    @staticmethod
    def is_number(s):
        try:
            float(s)
            return True
        except ValueError:
            return False